/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.gruposicom.logic;

import ar.com.gruposicom.domain.Politic;
import ar.com.gruposicom.domain.Result;
import ar.com.gruposicom.domain.TrueValue;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;

/**
 *
 * @author marcelo
 */
public class ResultAnalizer 
{

    public ResultAnalizer() {
    }
    
    public boolean getPoliticState(Result result, Politic politic)
    {
        boolean bandera = true;
        //obtengo la oracion
        String sentence = this.getSentence(result, politic);
        System.out.println("La oracion devuelta es: "+sentence);
        //Separo el objeto a analizar
        String object = this.getObject(sentence, politic);
        System.out.println("El valor del objeto a analizar es: "+object);
        if(object == null)
            bandera = false;
        else
        {
            //analizo el objeto
            bandera = this.analizeObject(object, politic);
            System.out.println("El resultado del analisis es "+bandera);
        }
        
        //devuelvo el resultado
        return bandera;
    }
    
    /**
     * Este metodo devuelve la oracion que se desea analizar
     * @param r Clase Result que contiene la coleccion de resultados que arrojo la ejecucion del comando
     * @param p
     * @return 
     */
    private String getSentence(Result r, Politic p)
    {
        StringBuilder sentence = new StringBuilder();
        Iterator<String> it = r.getValue().iterator();
        while(it.hasNext())
        {
            sentence.delete(0, sentence.length());
            sentence.append(it.next());
            //ya tengo la linea a analizar, ahora me fijo que la oracion se encuentre adentro
            int index = sentence.indexOf(p.getInitString());
            if(index != -1)
            {
                //oracion encontrada
//                String temp = sentence.substring(index,sentence.length());
//                sentence.delete(0, sentence.length());
//                sentence.append(temp);
                break;
            }
        }
        return sentence.toString();
    }
    
    private String getObject(String sentence, Politic p)
    {
        String object = new String();
        if(sentence.trim().length() == 0)
        {
            object = null;
        }
        else
        {
            System.out.println("la variable sentence contiene: "+sentence);
            
            object = sentence.replace(p.getInitString(), "");


            StringTokenizer palabra = new StringTokenizer(p.getEndString()," "); 
            String palabra1 = palabra.nextToken(); 
            int pos = object.indexOf(palabra1);
            object = object.substring(0,(pos-1));
        }
        
        
//        object = object.replace(p.getEndString(), "");
        return object;
    }
    
    private boolean analizeObject(String object, Politic p)
    {
        boolean band = false;
        Collection<TrueValue> values = p.getTrueValues();
        System.out.println("Cantidad de valore a evaluar: "+values.size());
        Iterator<TrueValue> it = values.iterator();
        TrueValue valor = null;
        while(it.hasNext())
        {
            valor = it.next();
            System.out.println("El tipo de dato a evaluar es: "+valor.getDataType().trim().toUpperCase());
            if(valor.getDataType().trim().toUpperCase().equals("NUMERIC"))
            {
                System.out.println("El objeto a nalizar es numerico");
                try
                {
                    System.out.println("La operacion a analizar es "+valor.getRuleComparation());
                    if(valor.getRuleComparation().trim().equals("="))
                    {
                        System.out.println("La operacion es =");
                        if(Double.parseDouble(object) == Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                    if(valor.getRuleComparation().trim().equals("<"))
                    {
                        System.out.println("La operacion es <");
                        if(Double.parseDouble(object) < Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                    if(valor.getRuleComparation().trim().equals(">"))
                    {
                        if(Double.parseDouble(object) > Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                    if(valor.getRuleComparation().trim().equals("<="))
                    {
                        if(Double.parseDouble(object) <= Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                    if(valor.getRuleComparation().trim().equals(">="))
                    {
                        if(Double.parseDouble(object) >= Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                    if(valor.getRuleComparation().trim().equals("<>"))
                    {
                        if(Double.parseDouble(object) != Double.parseDouble(valor.getValue()))
                            band = true;
                    }
                }
                catch(NumberFormatException e)
                {
                    band = false;
                }
                
            }
            if(valor.getDataType().trim().toUpperCase().equals("STRING"))
            {
                System.out.println("El objeto a nalizar es String");
                if(valor.getRuleComparation().trim().equals("="))
                {
                    if(object.trim().equalsIgnoreCase(valor.getValue().trim()))
                    {
                        band = true;
                    }
                }
                if(valor.getRuleComparation().trim().equals("<>"))
                {
                    if(!object.trim().equalsIgnoreCase(valor.getValue().trim()))
                    {
                        band = true;
                    }
                }
            }
        }
        return band;
    }
    
}
